package com.cakebackoffice.Model;


import java.util.ArrayList;
import java.util.List;

public class OrderLine implements Comparable<OrderLine> {

    private List<UnitarySale> unitarySales = new ArrayList<UnitarySale>();
    private float unitaryPrice;
    private float vat;
    private Order order;
    private Integer tag = 0;

    //constructeur de ligne pour un produit
    public OrderLine(UnitarySale u, Order order) {
        this.vat = u.getVAT();
        this.unitaryPrice = u.getPrice();
        this.getUnitarySales().add(u);
        this.order = order;
    }

    // ATTENTION : reste à traiter le cas des lignes produits qui sont payés dans le menu...
    // histoire de ne pas payer le menu ET le gâteau qui est déjà dedans (cad pas payer 2 fois)
    //manque donc un constructeur qui construit des lignes qui ont un produit ET un menu (menu qui comprend le produit)
    //il faudra aussi penser à gérer le nombre ! si je prend le menu 1 qui comprend 1 nyan cake, en ajouter un deuxième de nyan cake ne doit pas le mettre dans le menu.
    //il faut aussi gérer ce cas dans la classe order, methode getorderlines !!!
    //ébauche :

    //constructeur de lignes produit faisant partie d'un menu
    public OrderLine(MenuType _menuType, ProductType _productType, int _quantity) {

    }

    public void setTag(Integer tag) {
        this.tag = tag;
    }


    public Integer getTag() {
        return tag;
    }


    public ProductType getProductType() {
        ProductType productType = null;
        for (UnitarySale u : unitarySales) {
            productType = u.getProductType();
        }
        return productType;
    }

    public MenuType getMenuType() {
        MenuType menuType = null;
        for (UnitarySale u : unitarySales) {
            menuType = u.getMenuType();
        }
        return menuType;
    }

    public int getQuantity() {
        return this.unitarySales.size();
    }

    public float getUnitaryPrice() {
        return this.unitaryPrice;
    }

    public float getTotalTTC() {
        return (this.getTotalHT() * (1f + this.getVat() / 100f));
    }

    public float getTotalHT() {
        return (this.getUnitaryPrice() * this.getUnitarySales().size());
    }

    public String getTotalHTtoString() {
        return ((new Float(getTotalHT()).toString()));
    }

    public String getTotalTTCtoString() {
        return ((new Float(getTotalTTC()).toString()));
    }

    public List<UnitarySale> getUnitarySales() {
        return unitarySales;
    }

    private void setUnitarySales(List<UnitarySale> unitarySales) {
        this.unitarySales = unitarySales;
    }

    public float getVat() {
        return vat;
    }

    public void setVat(float vat) {
        this.vat = vat;
    }

    public boolean isMenu() throws Exception {
        boolean flag = true;
        boolean result = this.getUnitarySales().get(0).isMenu();
        for (UnitarySale u : this.getUnitarySales()) {
            if (result != u.isMenu()) {
                flag = false;
            }
        }
        if (!flag) {
            throw new Exception("OrderLine non cohérente");
        }
        return result;
    }

    public boolean isProduct() throws Exception {
        return !isMenu();
    }

    public void addOne() {
        Product p = new Product(this.getProductType());
        UnitarySale u = new UnitarySale(this.getUnitaryPrice(), this.getVat(), this.getProductType(), p);
        order.getUnitarySaleList().add(u);
        this.getUnitarySales().add(u);
    }

    public void removeOne() {
        UnitarySale u = this.getUnitarySales().get(0);
        order.getUnitarySaleList().remove(u);
        this.getUnitarySales().remove(u);
    }

    public void delete() {
        for (UnitarySale u : this.getUnitarySales()) {
            order.getUnitarySaleList().remove(u);
        }
        this.getUnitarySales().clear();
    }

    @Override
    public int compareTo(OrderLine orderLine) {
        try {
            if (isMenu()) {

                return this.getMenuType().getName().compareTo(orderLine.getMenuType().getName());
            } else {
                return this.getProductType().getName().compareTo(orderLine.getProductType().getName());
            }
        } catch (Exception e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return 0;
    }
}
